
package automaton;

import java.util.Set;
import java.util.Map;
import java.util.HashSet;
import java.util.HashMap;

/**
 * Estado de un automáta finito no determinístico.
 * 
 * @param <T> tipo de las transiciones
 */
public class NDState<T> implements State {
	
	private final Map<T, Set<NDState<T>>> transitions;
	private boolean acceptor;
	
	/**
	 * Constructor, indicando si el estado es final.
	 */
	public NDState(boolean acceptor) {
		this.acceptor = acceptor;
		this.transitions = new HashMap<T, Set<NDState<T>>>();
	}
	
	public boolean isAcceptor() {
		return acceptor;
	}
	
	/**
	 * Establece si este estado es final o de aceptación.
	 */
	public void setAcceptor(boolean acceptor) {
		this.acceptor = acceptor;
	}
	
	/**
	 * Agrega una transición desde este estado.
	 */
	public NDState<T> addTransition(T label, NDState<T> target) {
		if(transitions.get(label) == null)
			transitions.put(label, (Set<NDState<T>>)new HashSet<NDState<T>>());
		
		transitions.get(label).add(target);
		
		return this;
	}
	
	/**
	 * Devuelve el conjunto de estados correspondiente a avanzar por la
	 * transición indicada.
	 */
	public Set<NDState<T>> next(T label) {
		Set<NDState<T>> ret = transitions.get(label);
		
		return ret == null ? new HashSet<NDState<T>>() : ret; // TODO empty set
	}
	
	public String toString() {
		return (acceptor ? "SI-" : "NO-") + hashCode();
	}
}
